From: Giovanni Campagna Date: Wed, 20 Feb 2013 13:13:46 +0000 (+0100) Subject: AppDisplay: fix folder popup arrow X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4701 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=37700b4b1aa0488d9ad37215e6c08c66b006eb2e;p=gnome-shell.git AppDisplay: fix folder popup arrow The arrow origin must be in the coordinate space of the box pointer, but it cannot be calculated when the box pointer is shown, because it's not allocated yet, so pass the source to the boxpointer and adjust the arrow at the next paint. https://bugzilla.gnome.org/show_bug.cgi?id=694264 --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index c38e328b0..c247189eb 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -648,7 +648,8 @@ const AppFolderPopup = new Lang.Class({ return; this.actor.show(); - this._boxPointer.setArrowOrigin(this._source.actor.x + this._source.actor.width / 2); + + this._boxPointer.setArrowActor(this._source.actor); this._boxPointer.show(BoxPointer.PopupAnimation.FADE | BoxPointer.PopupAnimation.SLIDE); diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js index 233432e5f..9f85e0254 100644 --- a/js/ui/boxpointer.js +++ b/js/ui/boxpointer.js @@ -38,6 +38,7 @@ const BoxPointer = new Lang.Class({ this._arrowSide = arrowSide; this._userArrowSide = arrowSide; this._arrowOrigin = 0; + this._arrowActor = null; this.actor = new St.Bin({ x_fill: true, y_fill: true }); this._container = new Shell.GenericContainer(); @@ -228,6 +229,19 @@ const BoxPointer = new Lang.Class({ _drawBorder: function(area) { let themeNode = this.actor.get_theme_node(); + if (this._arrowActor) { + let [sourceX, sourceY] = this._arrowActor.get_transformed_position(); + let [sourceWidth, sourceHeight] = this._arrowActor.get_transformed_size(); + let [absX, absY] = this.actor.get_transformed_position(); + + if (this._arrowSide == St.Side.TOP || + this._arrowSide == St.Side.BOTTOM) { + this._arrowOrigin = sourceX - absX + sourceWidth / 2; + } else { + this._arrowOrigin = sourceY - absY + sourceHeight / 2; + } + } + let borderWidth = themeNode.get_length('-arrow-border-width'); let base = themeNode.get_length('-arrow-base'); let rise = themeNode.get_length('-arrow-rise'); @@ -537,6 +551,16 @@ const BoxPointer = new Lang.Class({ } }, + // @actor: an actor relative to which the arrow is positioned. + // Differently from setPosition, this will not move the boxpointer itself, + // on the arrow + setArrowActor: function(actor) { + if (this._arrowActor != actor) { + this._arrowActor = actor; + this._border.queue_repaint(); + } + }, + _shiftActor : function() { // Since the position of the BoxPointer depends on the allocated size // of the BoxPointer and the position of the source actor, trying